www.gusucode.com > VC++ SMS 串口的阻塞模式短信彩信的收发-源码程序 > VC++ SMS 串口的阻塞模式短信彩信的收发-源码程序/code/SMS/ComSms.cpp
//Download by http://www.NewXing.com #include <stdio.h> #include "ComSms.h" #include "Comm.h" #include "Sms.h" #include "SmsTraffic.h" #include "myxmodem.h" #define CTRLZ 26 #define CheckRet(nRet) \ { \ if(nRet == FALSE) \ { \ return nRet; \ } \ } CSmsTraffic* g_pSmsTraffic = NULL; char g_szSMSC[20] = {0}; char g_szPhone[20] = {0}; DLL_API BOOL COM_Open(const char* szComName) { return OpenComm(szComName); } ////////////////////////////////////////////////////////////////////////// DLL_API BOOL COM_Open1(const char* szComName, int nBaudRate, int nParity, int nByteSize, int nStopBits) { return OpenComm(szComName, nBaudRate, nParity, nByteSize, nStopBits); } ////////////////////////////////////////////////////////////////////////// DLL_API BOOL COM_Close() { return CloseComm(); } ////////////////////////////////////////////////////////////////////////// DLL_API BOOL COM_SMS_Init() { BOOL nRet = gsmInit(); if ( nRet == TRUE ) { g_pSmsTraffic = new CSmsTraffic(); if ( NULL == g_pSmsTraffic ) return FALSE; } return nRet; } ////////////////////////////////////////////////////////////////////////// DLL_API BOOL COM_SMS_Uninit() { if ( g_pSmsTraffic != NULL ) { delete g_pSmsTraffic; g_pSmsTraffic = NULL; } return TRUE; } ////////////////////////////////////////////////////////////////////////// DLL_API BOOL COM_SMS_SetAddr(const char* szSMSC, const char* szPhone) { if ( NULL == szSMSC ) return FALSE; int iLen = strlen(szSMSC); if ( iLen > 20 ) return FALSE; strcpy(g_szSMSC, szSMSC); if ( szPhone != NULL ) { iLen = strlen(szPhone); if ( iLen > 20 ) return FALSE; strcpy(g_szPhone, szPhone); } return TRUE; } ////////////////////////////////////////////////////////////////////////// DLL_API BOOL COM_SMS_SendText(const char* szText, const char* szPhone, bool bWait) { BOOL nRet = FALSE; // 检查短消息内容是否空,或者超长 WCHAR wchar[1024]; int nCount = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, wchar, 1024); if(nCount <= 1) { return nRet; } else if(nCount > 70) // 我们决定全部用UCS2编码,最大70个字符(半角/全角) { return nRet; } SM_PARAM SmParam; memset(&SmParam, 0, sizeof(SM_PARAM)); // 填充短消息结构 strcpy(SmParam.SCA, g_szSMSC); if ( NULL == szPhone ) strcpy(SmParam.TPA, g_szPhone); else strcpy(SmParam.TPA, szPhone); strcpy(SmParam.TP_UD, szText); SmParam.TP_PID = 0; SmParam.TP_DCS = GSM_UCS2; // 发送短消息 if ( g_pSmsTraffic != NULL ) { g_pSmsTraffic->PutSendMessage(&SmParam); if ( bWait ) { nRet = g_pSmsTraffic->GetSendMsgResult(); nRet = nRet == GSM_OK ? TRUE : FALSE; } else nRet = TRUE; } return nRet; } ////////////////////////////////////////////////////////////////////////// BOOL COM_SMS_SetReadFun(COM_SMS_ReadFUN funReadSMS) { if ( g_pSmsTraffic != NULL ) { g_pSmsTraffic->SetReadSMSFun(funReadSMS); return TRUE; } return FALSE; } ////////////////////////////////////////////////////////////////////////// BOOL WaitResponse(void) { unsigned long wCount; char Recvbuf[100]; BOOL flag = FALSE; wCount=0; while( flag == FALSE ) { wCount = ReadComm(Recvbuf, 100); Recvbuf[wCount]='\0'; Sleep(100); if(strstr(Recvbuf,"OK")!=NULL || strstr(Recvbuf,">")!=NULL ||strstr(Recvbuf,"Ok")!=NULL||strstr(Recvbuf,"MMSTRACE")!=NULL) { flag = TRUE; break; } wCount=0; if(strstr(Recvbuf,"ERROR")!=NULL) return FALSE; } return flag; } ////////////////////////////////////////////////////////////////////////// BOOL SendATC(char *sendbuf) { unsigned long wCount; BOOL flag = FALSE; wCount = WriteComm(sendbuf,strlen(sendbuf)); flag = WaitResponse(); return flag; } ////////////////////////////////////////////////////////////////////////// BOOL COM_MMS_Config() { BOOL bReturn = FALSE; bReturn = SendATC("at$mmsbearer=1,\"cmwap\",,\r"); if(!bReturn) return bReturn; bReturn = SendATC("at$mmsproxy=\"10.0.0.172\",80\r"); if(!bReturn) return bReturn; bReturn = SendATC("at$mmscommmode=2\r"); if(!bReturn) return bReturn; //at$mmscurl="http://mmsc.monternet.com" bReturn = SendATC("at$mmscurl=\"http://mmsc.monternet.com\"\r"); if(!bReturn) return bReturn; //at$fdel="*" bReturn = SendATC("at$fdel=\"*\"\r\n"); return bReturn; } ////////////////////////////////////////////////////////////////////////// void changetounicode(char *buf,char *src) { WCHAR *tempbuf ; int i,nLen; nLen = MultiByteToWideChar(CP_ACP, 0,src, -1, NULL, NULL); tempbuf= new WCHAR[nLen]; MultiByteToWideChar(CP_ACP, 0,src, -1, tempbuf, nLen); for(i=0;i<nLen-1;i++) sprintf(buf+4*i,"%04lx",tempbuf[i]); delete [] tempbuf; sprintf(buf+4*i,"%c",CTRLZ); return; } ////////////////////////////////////////////////////////////////////////// BOOL COM_SMS_SendMMS(const char* szTitle, const char* szText, const char* szFileName, const char* szPhone) { char Sendbuf[4000]; char title[100]; char Message[1000]; strcpy(title, szTitle); strcpy(Message, szText); BOOL nRet = COM_MMS_Config(); //at$fdel="*" sprintf(Sendbuf,"at$fdel=\"*\"\r\n"); nRet = SendATC(Sendbuf); char temp[100]; char filename[100]; unsigned char *buf = NULL; unsigned long length; int s = 0; int n = 0; strcpy(filename, szFileName); sprintf(temp,"%c%s", 97, filename); sprintf(Sendbuf,"at$fupl=\"a%s\"\r\n", filename); nRet = SendATC(Sendbuf); FILE* fp=fopen(filename, "rb"); if(fp==NULL) { return false; } fseek(fp,0,2); length=ftell(fp); buf=(unsigned char *)malloc(length); fseek(fp,0,0); s=0; while(!feof(fp)) { n=fread(buf+s,sizeof(char),100,fp); s=s+n; } myxmodem *mytran = new myxmodem(); if ( mytran != NULL ) { int iRet = mytran->send_packet_data(buf,length); nRet = WaitResponse(); delete mytran; mytran = NULL; } free(buf); fclose(fp); //at$mmsw=0 sprintf(Sendbuf,"at$mmsw=0\r\n"); nRet = SendATC(Sendbuf); CheckRet(nRet); //at$mmscs="UCS2" sprintf(Sendbuf,"at$mmscs=\"UCS2\"\r\n"); nRet = SendATC(Sendbuf); CheckRet(nRet); //at$mmsw=1,1 sprintf(Sendbuf,"at$mmsw=1,1\r\n"); nRet = SendATC(Sendbuf); CheckRet(nRet); sprintf(Sendbuf,"%s%c",szPhone,CTRLZ); nRet = SendATC(Sendbuf); CheckRet(nRet); //at$mmsw=4,1 sprintf(Sendbuf,"at$mmsw=4,1\r\n"); nRet = SendATC(Sendbuf); CheckRet(nRet); changetounicode(Sendbuf,title); nRet = SendATC(Sendbuf); CheckRet(nRet); //at$mmsw=5,1,1 sprintf(Sendbuf,"at$mmsw=5,1,1\r\n"); nRet = SendATC(Sendbuf); CheckRet(nRet); changetounicode(Sendbuf,Message); // sprintf(Sendbuf,"%s%c",Message,CTRLZ); nRet = SendATC(Sendbuf); CheckRet(nRet); // //at$mmsw=6,1,"a111.jpg" // sprintf(Sendbuf,"at$mmsw=6,%d,\"%s\"\r\n", 0, LPCTSTR(szFileName)); // nRet = SendATC(Sendbuf); // CheckRet(nRet); // // nRet = COM_MMS_AddPageFile(0, Message, szFileName); // CheckRet(nRet); //上传 { //把上传文件加入彩信 sprintf(temp, "at$mmsw=6,1,\"a%s\"\r\n", filename); nRet = SendATC(temp); CheckRet(nRet); } //At$mmssend sprintf(Sendbuf,"at$mmssend\r\n"); nRet = SendATC(Sendbuf); CheckRet(nRet); return TRUE; } //////////////////////////////////////////////////////////////////////////